package com.curricula.curriculum.service;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.curricula.curriculum.dao.Conexion;
import com.curricula.curriculum.dao.EscolarDAO;
import com.curricula.curriculum.vo.EscolarVO;
import com.curricula.usuario.vo.UsuarioVO;

/**
 * Service que ofrece las funciones principales de administracion de datos
 * en el curriculum del usuario
 * 
 * @author Hugo
 * @version 1.0
 * 
 */
public class EscolarService {
	static Logger log = Logger.getLogger(EscolarService.class);
	
	/**
	 * Servicio que actualiza la informacion del cliente por medio de un id
	 * 
	 * @author Hugo
	 * @param DocumentacionForm documentoVO
	 * @return boolean insertado
	 * @throws SQLException
	 */
	public static boolean actualizar(EscolarVO valor, EscolarVO filtro)throws SQLException{
		boolean actualizado = false;
		Connection conn = null;
		try{
			conn = Conexion.getConexion();
			conn.setAutoCommit(false);		
			actualizado = EscolarDAO.update(valor,filtro, conn);
			conn.commit();
		}catch (SQLException e) {
			log.error("Error SQL: "+ e);
			try {
				log.warn("Realizando Rollback");
				conn.rollback();
			} catch (SQLException e1) {
				log.error("Error de SQL: "+ e1);
				throw e1;
			}
		}finally{
			if(conn!= null)
				try {
					conn.close();
				} catch (SQLException e) {
					log.error("Error al cerrar la conexion: "+ e);
				}				
		}
		return actualizado;		
	}
	
	/**
	 * Servicio que actualiza la visibilidad del campo por medio de un id
	 * esto afectara al mostrar el reporte, solo se visualizan los campos
	 * que tengan visible = 1 en la BD
	 * 
	 * @author Hugo
	 * @param DocumentacionForm documentoVO
	 * @return boolean insertado
	 * @throws SQLException
	 */
	public static boolean visible(String id, UsuarioVO userSesion)throws Exception{
		boolean actualizado;		
		EscolarVO info = new EscolarVO();
		info.setIdUser(userSesion.getUsrId());		
		try {
			info.setId(Integer.parseInt(id));
			EscolarVO filtro = new EscolarVO();
			EscolarVO valor = obtener(info).get(0);
			if(valor.getVisible().equalsIgnoreCase(""))
				valor.setVisible("checked");
			else
				valor.setVisible("");
			filtro.setIdUser(userSesion.getUsrId());
			filtro.setId(Integer.parseInt(id));
			actualizado = actualizar(valor,filtro);				
		}catch (Exception e) {
			log.error("Error: "+ e);
			throw e;
		}
		return actualizado;		
	}
	
	/**
	 * Servicio que ordena los elementos en la tabla dependiendo del array
	 * que se envie como parametro por el metodo de ajax
	 * 
	 * @author Hugo
	 * @param DocumentacionForm documentoVO
	 * @return boolean insertado
	 * @throws SQLException
	 */
	public static boolean ordenar(String []parametro, UsuarioVO userSesion)throws SQLException{
		Connection conn = null;
		EscolarVO info = new EscolarVO();
		info.setIdUser(userSesion.getUsrId());		
		try {
			conn = Conexion.getConexion();
			conn.setAutoCommit(true);
			try {
				for (int i=1;i<parametro.length;i++){
					EscolarVO filtro = new EscolarVO();
					info.setId(Integer.parseInt(parametro[i]));
					EscolarVO valor = obtener(info).get(0);
					valor.setOrden(i);
					filtro.setIdUser(userSesion.getUsrId());
					filtro.setId(Integer.parseInt(parametro[i]));
					EscolarDAO.update(valor,filtro, conn);				
				}
			} catch (SQLException e) {
				log.error("Error SQL: "+ e);
				try {
					log.warn("Realizando Rollback");
					conn.rollback();
				} catch (SQLException e1) {
					log.error("Error de SQL: "+ e1);
					throw e1;
				}
			}			
		} catch (SQLException e) {
			log.error("Error de SQL: "+ e);
			throw e;
		}finally{
			if(conn!= null)
				try {
					conn.close();
				} catch (SQLException e) {
					log.error("Error al cerrar la conexion: "+ e);
				}				
		}		
		return true;		
	}
	
	/**
	 * Servicio que inserta la informacion escolar del usuario en la tabla curricula.escolaridad
	 * dependiendo del ID que este registrado en la sesion. Inserta todos los registros necesarios
	 * dependiendo de las solicitudes del usurio.
	 * 
	 * @author Hugo
	 * @param EscolarForm escolarVO
	 * @return boolean insertado
	 * @throws SQLException
	 */
	public static boolean llenar(EscolarVO escolar)throws SQLException{
		boolean insertado = false;
		Connection conn = null;
		try{
			conn = Conexion.getConexion();
			conn.setAutoCommit(false);
			try{
				int orden = orden(escolar.getIdUser());
				escolar.setOrden(orden);
				insertado = EscolarDAO.insert(escolar, conn);
				conn.commit();
			}catch (SQLException e) {
				log.error("Error SQL: "+ e);
				try {
					log.warn("Realizando Rollback");
					conn.rollback();
				} catch (SQLException e1) {
					log.error("Error de SQL: "+ e1);
					throw e1;
				}
			}			
		}catch(SQLException e){
			log.error("Error de SQL: "+ e);
			throw e;
		}finally{
			if(conn!= null)
				try {
					conn.close();
				} catch (SQLException e) {
					log.error("Error al cerrar la conexion: "+ e);
				}				
		}
		return insertado;	
	}
	
	/**
	 * Servicio que obtiene un objeto del tipo EscolarForm con la informacion escolar 
	 * del usuario de la tabla curricula.escolaridad dependiendo del ID que este registrado en la sesion. 
	 * 
	 * @author Hugo
	 * @param EscolarForm personalVO
	 * @return List con todos los registros de las escuelas
	 * @throws SQLException
	 */
	public static List<EscolarVO> obtener(EscolarVO escolar) throws SQLException{
		List<EscolarVO> listaPersonal = new ArrayList<EscolarVO>();
		Connection conn = null;
		try{
			conn = Conexion.getConexion();
			conn.setAutoCommit(false);
			try{
				listaPersonal = EscolarDAO.find(escolar, conn);
				conn.commit();
			}catch (SQLException e) {
				log.error("Error SQL: "+ e);
				try {
					log.warn("Realizando Rollback");
					conn.rollback();
				} catch (SQLException e1) {
					log.error("Error de SQL: "+ e1);
					throw e1;
				}
			}			
		}catch(SQLException e){
			log.error("Error de SQL: "+ e);
			throw e;
		}finally{
			if(conn!= null)
				try {
					conn.close();
				} catch (SQLException e) {
					log.error("Error al cerrar la conexion: "+ e);
				}				
		}
		return listaPersonal;		
	}
	
	/**
	 * Servicio que inserta la informacion escolar del usuario en la tabla curricula.escolaridad
	 * dependiendo del ID que este registrado en la sesion. Inserta todos los registros necesarios
	 * dependiendo de las solicitudes del usurio.
	 * 
	 * @author Hugo
	 * @param EscolarForm escolarVO
	 * @return boolean insertado
	 * @throws SQLException
	 */
	public static boolean eliminar(int idEscolar, int idUser)throws SQLException{
		boolean insertado = false;
		Connection conn = null;
		try{
			conn = Conexion.getConexion();
			conn.setAutoCommit(false);
			try{
				insertado = EscolarDAO.delete(idEscolar,idUser, conn);
				conn.commit();
			}catch (SQLException e) {
				log.error("Error SQL: "+ e);
				try {
					log.warn("Realizando Rollback");
					conn.rollback();
				} catch (SQLException e1) {
					log.error("Error de SQL: "+ e1);
					throw e1;
				}
			}			
		}catch(SQLException e){
			log.error("Error de SQL: "+ e);
			throw e;
		}finally{
			if(conn!= null)
				try {
					conn.close();
				} catch (SQLException e) {
					log.error("Error al cerrar la conexion: "+ e);
				}				
		}
		return insertado;	
	}
	
	/**
	 * Servicio que actualiza el orden de precedencia, en el que se mostraran los
	 * resultados de la informaci�n.
	 * 
	 * @author Hugo
	 * @param int idUser
	 * @return int el numero de orden con el cual se insertara
	 * @throws SQLException
	 */
	public static int orden(int idUser)throws SQLException{
		List<EscolarVO> ordenList = new ArrayList<EscolarVO>();
		EscolarVO a= new EscolarVO();
		a.setIdUser(idUser);
		try {
			ordenList = obtener(a);
			if(ordenList.size()==0)
				return 1;
			else{
				return ordenList.size()+1;				
			}
		} catch (SQLException e) {
			log.error("Error de SQL: "+ e);
			throw e;
		}
	}
}
